Ruby 日記 36日目: ネストとレキシカルスコープ
次のプログラムを実行するとどうなりますか
code:gold/ex36/main.rb
module K
CONST = "Good, night"
class P
end
end
module K::P::M
class C
CONST = "Good, evening"
end
end
module M
class C
CONST = "Hello, world"
end
end
class K::P
class M::C
p CONST
end
end
選択肢:
例外が発生する
"Good, night"と表示される
"Good, evening"と表示される
"Hello, world"と表示される
解説:
類似問題は
あたりかな?
この問題の p CONST で参照しているのは K::P::M::C
このレキシカルスコープ内で定義されているCONSTがあれば探す
code:rb
module K::P::M
class C
CONST = "Good, evening"
end
end
が、まさにそう
過去の自分が書いた解説を見ると「それはそう」って感じだけど、いざ問題を解こうとすると気が動転してミスったりする
なので正解は「"Good, evening"と表示される」だね
code:sh
# ruby gold/ex36/main.rb
"Good, evening"
/icons/hr.icon
code:rb
module M
CONST = "Hello"
end
module M
class C
def say
CONST
end
end
end
puts M::C.new.say #=> Hello moduleを再オープンしている場合でも、値は保持されているので Hello が表示されます。
以下のように M::C と記述するとクラスMの探索は行われないようです。
てか、M::CのMがrootに定義さえたMモジュールなのか、別で定義されたMクラスなのか、も分からないからかな?
module M と class Mって同時に定義できなそうではあるけど
code:rb
module M
CONST = "Hello"
end
class M::C
def say
CONST
end
end
puts M::C.new.say #=> uninitialized constant M::C::CONST (NameError) このへん引っかかりやすいよね〜〜